package com.proback.utils;

import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.security.Key;
import java.util.Date;

@Component
public class JwtUtil {

    private static final Logger logger = LoggerFactory.getLogger(JwtUtil.class);

    // 你的密钥（建议放配置文件中）
    private final Key key = Keys.hmacShaKeyFor("MySuperSecretKeyMySuperSecretKey".getBytes()); // >=256位

    private final long expirationMs = 1000 * 60 * 30; // 半小时有效（毫秒）

    // 生成 Token
    public String generateToken(String account) {
        logger.info("为 {} 生成Token", account);
        return Jwts.builder()
                .setSubject(account)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + expirationMs))
                .signWith(key, SignatureAlgorithm.HS256)
                .compact();
    }

    /**
     * 从给定的JWT Token中提取过期时间。
     *
     * @param token 需要解析的JWT Token字符串
     * @return 返回Token中的过期时间，如果解析失败则返回null
     */
    public Date getExpirationFromToken(String token) {
        try {
            return Jwts.parserBuilder()
                    .setSigningKey(key)
                    .build()
                    .parseClaimsJws(token)
                    .getBody()
                    .getExpiration();
        } catch (Exception e) {
            logger.error("获取Token过期时间失败: {}", e.getMessage());
            return null;
        }
    }

    /**
     * 验证给定的JWT Token是否有效，包括签名验证和过期时间检查。
     *
     * @param token 需要验证的JWT Token字符串
     * @return 如果Token有效且未过期则返回true，否则返回false
     */
    public boolean validateToken(String token) {
        try {
            Jws<Claims> claimsJws = Jwts.parserBuilder()
                    .setSigningKey(key)
                    .build()
                    .parseClaimsJws(token);

            // 额外检查过期时间
            Date expiration = claimsJws.getBody().getExpiration();
            boolean isExpired = expiration.before(new Date());

            if (isExpired) {
                logger.warn("Token已过期: {} - 过期时间: {}", token, expiration);
                return false;
            }

            logger.info("Token验证成功: {}... - 过期时间: {}", token.substring(0, 20), expiration);
            return true;
        } catch (ExpiredJwtException ex) {
            logger.warn("[Exception] Token已过期: {}... - 过期时间: {}", token.substring(0, 20), ex.getClaims().getExpiration());
            return false;
        } catch (JwtException | IllegalArgumentException ex) {
            logger.error("无效Token: {} - 原因: {}", token, ex.getMessage());
            return false;
        }
    }

    /**
     * 从 Token 中解析出账号
     * @param token JWT Token
     * @return 账号（手机号）
     */
    public String getAccountFromToken(String token) {
        try {
            return Jwts.parserBuilder()
                    .setSigningKey(key)
                    .build()
                    .parseClaimsJws(token)
                    .getBody()
                    .getSubject();
        } catch (Exception e) {
            logger.error("从 Token 中解析账号失败: {}", e.getMessage());
            return null;
        }
    }
}
